package com.bjsxt;
/**线程的联合  join()
 * 当前线程邀请调用方法的线程优先执行，在调用方法的线程执行结束之前，当前线程
 * 不能再次执行。线程A在运行期间，可以调用线程B的join()方法，让线程B和A联合。
 * 这样，线程A就必须等待线程B执行完毕，才能继续执行*/
//join（）方法就是指调用该方法的线程在执行完run()方法后，再执行join（）方法后面的代码，
//即将两个线程合并，用于实现同步控制。

class A implements Runnable{
    @Override
    public void run() {
        for (int i=0;i<10;i++){
            System.out.println(Thread.currentThread().getName()+" "+i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
class B implements Runnable{
    @Override
    public void run() {
        for (int i=0;i<20;i++){
            System.out.println(Thread.currentThread().getName()+" "+i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
public class JoinThread {
    public static void main(String[] args) {
        //主线程和A联合
        //没有用join方法时，主线程和A是交替运行
        Thread t = new Thread(new A());
        //现在有三个线程，B与联合无关，交替运行
        Thread t1 = new Thread(new B());
        t.start();
        t1.start();
        //主线程
        for(int i=0;i<10;i++){
            System.out.println(Thread.currentThread().getName()+" "+i);
            //当前线程t,和主线程联合  运行时由交替变为串行
            //当主线程运行到2，子线程运行进来，直到运完，主线程再运行
            if(i ==2){
                try {
                    t.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }


    }
}
